package com.gtw.template;

/**
 * 定义一些算法框架,如templateMethod(),而一些步骤延续到子类中,如:doSomething()
 * 子类不改变算法结构,可重新定义算法的特定步骤
 *
 * 优点:
 *      1.封装不变部分,扩展可变部分
 *      2.提取公共代码便于维护
 *      3.行为由父类控制,子类实现
 * 使用场景:
 *      1.多个子类有公共的方法,并且基本逻辑相同
 *      2.重要、复杂的算法可以把核心算法定为模板方法,周边相关细节由子类具体实现
 * 最佳实践:
 *      许多开源框架,提供一个抽象类,然后写了一堆子类,如果需要扩展功能,可以继承这个抽象类,覆写protected方法,
 *      最后调用一个类似execute()的方法
 */
public abstract class Template {
    protected abstract void doSomething();

    protected abstract void doAnything();

    /**
     * 一般模板方法都加上final关键字,不允许被覆写
     */
    public final void templateMethod(){
        this.doSomething();
        this.doAnything();
    }
}
